home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / tpsc.h.z / tpsc.h
C/C++ Source or Header  |  1992-04-03  |  26KB  |  665 lines

  1. /**************************************************************************
  2.  *                                      *
  3.  *          Copyright (C) 1986, Silicon Graphics, Inc.          *
  4.  *                                      *
  5.  *  These coded instructions, statements, and computer programs  contain  *
  6.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  8.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  *                                      *
  11.  **************************************************************************/
  12.  
  13. #ident    "sys/tpsc.h: $Revision: 3.41 $"
  14.  
  15. /*  This files contains the definitions and data structures specific to
  16.  *  the SCSI tape drives (currently 1/4 inch cartridge, 8mm videotape,
  17.  *  9 track reel, DAT tape).
  18. */
  19.  
  20.  
  21. /* Layout of the INQUIRY data */
  22.  
  23. /* max inquiry info we accept */
  24. #define    MAX_INQUIRY_DATA    (sizeof (ct_g0inq_data_t))
  25. #define    INQ_PDT_CT    0x01    /* peripheral device type, for tape    */
  26. #define    MAX_INQ_VID    8    /* # bytes for vendor ID        */
  27. #define    MAX_INQ_PID    16    /* # bytes for product ID        */
  28. #define    MAX_INQ_PRL    8    /* # bytes for product revision level    */
  29.  
  30. /* NOTE: you can't enlarge this structure for drives that return more
  31. * data without breaking old binaries since some of their data would
  32. * be overwritten by an MTSCSIINQ ioctl.  This structure is used in
  33. * both user programs and in the driver. */
  34. typedef    struct {
  35.     u_char    id_pqt: 3,    /* peripheral qual type     */
  36.         id_pdt: 5;    /* peripheral device type     */
  37.     u_char    id_rmb: 1,    /* removable media bit         */
  38.         id_dtq: 7;    /* device type qualifier     */
  39.     u_char    id_iso: 2,    /* ISO version             */
  40.         id_ecma: 3,    /* ECMA version             */
  41.         id_ansi: 3;    /* ANSI version             */
  42.     u_char    id_aenc: 1,    /* supports async event notification */
  43.         id_termiop: 1,    /* supports termiop msg */
  44.         id_rsv0: 2,    /* reserved */
  45.         id_respfmt: 4;    /* response format */
  46.     u_char    id_ailen;    /* additional inquiry length     */    
  47.     u_char    id_rsv1;    /* reserved             */
  48.     u_char    id_rsv2;    /* reserved             */
  49.         /* next 8 bits valid only if id_respfmt 2 (scsi2) */
  50.     u_char    id_reladr: 1,    /* supports relative addressing */
  51.         id_wide32: 1,    /* supports 32 bit wide bus  */
  52.         id_wide16: 1,    /* supports 16 bit wide bus  */
  53.         id_sync: 1,    /* supports sync */
  54.         id_linked: 1,    /* supports linked cmds */
  55.         id_rsv3: 1,    /* reserved     */
  56.         id_cmdq: 1,    /* supports command queing */
  57.         id_softre: 1;    /* supports soft reset */
  58.     u_char    id_vid[ MAX_INQ_VID ];    /* vendor ID         */
  59.     u_char    id_pid[ MAX_INQ_PID ];    /* product ID         */
  60.     u_char    id_prl[ MAX_INQ_PRL ];    /* product revision level*/
  61. } ct_g0inq_data_t;
  62.  
  63. #ifdef _KERNEL
  64.  
  65. /*
  66. ** Layout of the various areas that receive/xmit info.
  67. **
  68. ** Layout of the EXTENDED SENSE data
  69. */
  70.  
  71. #define    MAX_SENSE_DATA    (sizeof (ct_g0es_data_t)) /* max sense info      */
  72.  
  73. struct exab_as {    /* Exabyte add sense data */
  74.     u_char rs0[4];    /* reserved */
  75.     u_char as;    /* add sense */
  76.     u_char aq;    /* add sense qualifier */
  77.     u_char rs1[2];    /* reserved */
  78.     u_char errs[3];    /* recovered errs */
  79.     u_char pf: 1,    /* power fail/reset */
  80.            bpe: 1,    /* bus parity error */
  81.            fpe: 1,    /* buffer parity error */
  82.            me: 1,    /* media error (uncorrectable) */
  83.            eco: 1,    /* error counter (exerrs) overflow */
  84.            tme: 1,    /* tape motion error */
  85.            tnp: 1,    /* no tape in drive */
  86.            bot: 1;    /* at BOT */
  87.     u_char xfr: 1,    /* disconnect error (while trying to pause transfer) */
  88.            tmd: 1,    /* error occured during SPACE */
  89.            wp: 1,    /* write protected */
  90.            fmke: 1,    /* error while writing FM */
  91.            ure: 1,    /* data flow underrun from media error */
  92.            we1: 1,    /* too many retries on write; media error */
  93.            sse: 1,    /* hardware failure in servo system */
  94.            fe: 1;    /* hardware failure in data formatter */
  95.     u_char rs2: 6,    /* reserved */
  96.            wseb: 1,    /* write splice error, blank tape (hardware) */
  97.            wse0: 1;    /* write splice error, overshoot (hardware) */
  98.     u_char rs3;    /* reserved */
  99.     u_char left[3];    /* remaining tape in 1K blocks to LEOT */
  100. };
  101.  
  102. struct ciph_as {    /* Cipher add sense data */
  103.     u_char as;    /* add sense  */
  104.     u_char errs[2];    /* recovered errs */
  105. };
  106.  
  107. struct viper_as {    /* Viper add sense data */
  108.     u_char copysrc;    /* copy source sense data pointer */
  109.     u_char copydst;    /* copy destination sense data pointer */
  110.     u_char rs0[2];    /* reserved */
  111.     u_char errs[2];    /* recovered errs */
  112.     u_char copyst;    /* copy target status*/
  113.     u_char copysns[8];    /* copy target sense data */
  114. };
  115.  
  116. struct tand_as {    /* Tandberg 36[246]0 add sense data */
  117.     u_char copysrc;    /* copy source sense data pointer */
  118.     u_char copydst;    /* copy destination sense data pointer */
  119.     u_char rs0[2];    /* reserved */
  120.     u_char errs[2];    /* recovered errs */
  121.     u_char ercl: 4, ercd: 4;    /* err class, and code */
  122.     u_char exercd;    /* extended error code */
  123.     u_char blkctr[3];    /* i/o blk cnt since open or space */
  124.     u_char fmctr[2];    /* FM cnt since open or space */
  125.     u_char underrun[2];    /* underrun cnt since open or space */
  126.     u_char margblk;    /* marginal blks cnt since open or space */
  127.     u_char blksbuf;    /* blocks unwritten in buffer after err */
  128.     /* up to 20 copy sense bytes follow, but we don't implement COPY */
  129. };
  130.  
  131. struct kenn_as {    /* Kennedy add sense data */
  132.     u_char rs0[4];    /* reserved */
  133.     u_char as;    /* add sense */
  134.     u_char aq;    /* add sense qualifier */
  135.     u_char rs1[2];    /* reserved */
  136. };
  137.  
  138. struct scsi2_as {    /* DAT and other drives in scsi2 mode */
  139.     u_char cmdspecific[4];    /* cmd specific; usually used only
  140.             for COPY cmd */
  141.     u_char as;    /* add sense */
  142.     u_char aq;    /* add sense qualifier */
  143.     u_char fru;    /* field replaceable unit code (0 non-specific) */
  144.     u_char sksv: 1,    /* sense key specific valid */
  145.            cd: 1,    /* err in cmd if set, otherwise in data out */
  146.            rsv: 2,    /* reserved */
  147.            bpv: 1,    /* if 1, bitptr is valid */
  148.            bitp: 3;    /* if 1, bitptr is valid */
  149.     u_char sensespecific[2];    /* if sksv, cmd/err specific */
  150. };
  151.  
  152. typedef struct
  153. {
  154.     u_char    esd_valid: 1,    /* valid bit        */
  155.         esd_errclass: 3,    /* error class        */
  156.         esd_mbz0: 3,    /* must be zero        */
  157.         esd_defer: 1;    /* deferred err from prev cmd */
  158.     u_char    esd_copyseg;        /* seg from COPY cmd*/
  159.     u_char    esd_fm: 1,    /* file mark        */
  160.         esd_eom: 1,    /* logical EOM (CT_EW)  */
  161.         esd_ili: 1,       /* illegal length indicator */
  162.         esd_reserve: 1,    /* unused for now */
  163.         esd_sensekey: 4;    /* sense key        */
  164.     u_char    esd_resid[4];        /* residual length    */
  165.     u_char    esd_aslen;            /* additional sense length    */
  166.     union {
  167.         struct exab_as _exab;    /* Exabyte */
  168.         struct ciph_as _ciph;    /* Cipher 540 */
  169.         struct tand_as _tand;    /* Tandberg 36[246]0 */
  170.         struct viper_as _viper;    /* Viper 150,60 */
  171.         struct kenn_as _kenn;    /* Kennedy 96X2 */
  172.         struct scsi2_as _rsscsi2;    /* SCSI 2 DAT, etc. */
  173.     } asd;
  174. } ct_g0es_data_t;
  175.  
  176. #define exab    asd._exab
  177. #define ciph    asd._ciph
  178. #define tand    asd._tand
  179. #define viper    asd._viper
  180. #define kenn    asd._kenn
  181. #define rsscsi2    asd._rsscsi2
  182.  
  183. /*
  184. ** Layout of the INQUIRY data
  185. */
  186.  
  187.  
  188. /*    used to set tape type from the inquiry cmd and info from master.d/tpsc.
  189.     This allows SGI and users to add new tape drives of known types without
  190.     re-compiling the driver.  The assumption is that the SCSI commands,
  191.     block size, capablities, and request sense info are constant within
  192.     a type.  This is rarely completely true, but is often close enough
  193.     to allow a drive to work.
  194. */
  195. struct tpsc_types {
  196. #if IP17 && PROM
  197. #define    U_CHAR    ulong
  198. #else
  199. #define    U_CHAR    u_char
  200. #endif
  201.     U_CHAR tp_type;    /* a type from the tape types below, used for
  202.         some capability, and some error code decoding */
  203.     U_CHAR tp_hinv;    /* a type from the TP* tape types in invent.h;
  204.         is returned by the MTCAPABILITY ioctl */
  205.     U_CHAR tp_vlen;    /* length of vendor string */
  206.     U_CHAR tp_plen;    /* length of product string */
  207.     u_char tp_vendor[MAX_INQ_VID];    /* vendor ID */
  208.     u_char tp_product[MAX_INQ_PID];    /* product ID */
  209.     U_CHAR tp_msl_pglen;    /* # of extra bytes transferred on modeselect
  210.         (does not include MSD_IND_SIZE).  page 0 is only page done
  211.         currently, except for the partition stuff for DAT, which
  212.         follows SCSI 2 and so should not require any changes. */
  213.     u_char *tp_msl_data;    /* values to ALWAYS put in msld_vend when
  214.         doing a mode select; ptr should be null if tp_msl_pglen is 0 */
  215.     U_CHAR tp_density[4];    /* values for 4 possible densities; used
  216.         only when MTCAN_SETDEN is true; indexed by DENSITY_DEV() */
  217.     ulong  tp_capablity;    /* capablities supported */
  218.     ulong  tp_xfr_divisor;    /* transfer timeout; see XFER_TIMEO
  219.         (units are inverse ticks) */
  220.     ulong  tp_mintimeo;    /* minimum timeout for any cmd; see
  221.         XFER_TIMEO and SHORT_TIMEO (units are seconds) */
  222.     ulong  tp_spacetimeo;    /* space cmd timeout; (units are in seconds),
  223.         see SPACE_TIMEO() */
  224.     ulong  tp_rewtimeo;    /* timeout for very long operations, like
  225.         rewind, retension, erase; (units are in seconds);
  226.         time is doubled for retension. */
  227.     ulong  tp_dfltblksz;    /* default (and often only) block size in
  228.         fixed block mode */
  229.     ulong  tp_recblksz;    /* recommended blocking factor, used only for 
  230.         MTIOCGETBLKINFO ioctl; note that it is given in bytes,
  231.         not as a multipier for the blocksize. */
  232. };
  233.  
  234.  
  235. /*
  236. ** Layout of the MODE SELECT Parameter List
  237. */
  238.  
  239. /* maximum amount of mode select info we send */
  240. #define    MAX_MODE_SEL_DATA    (sizeof (ct_g0msl_data_t))
  241. #define    MSD_IND_SIZE    12    /* # bytes in vendor independent mode select (no
  242.     page data, just header and block descr) */
  243. #define    MSLD_BDLEN    0x08    /* block descriptor cnt        */
  244. #define    MSLD_BLKCNT_SZ    3    /* number of blocks        */
  245. #define    MSLD_BLKLEN_SZ    3    /* length of a block        */
  246. #define MS_VEND_LEN    0x10    /* DAT is now largest */
  247.  
  248. typedef struct
  249. {
  250.     /* 4 byte header */
  251.     u_char    msld_mbz0;    /* reserved, must be 0            */
  252.     u_char    msld_mbz1;    /* reserved, must be 0            */
  253.     u_char    msld_mbz2: 3,    /* reserved, must be 0            */
  254.         msld_bfm: 1,    /* buffered/unbuffered mode        */
  255.         msld_speed: 4;    /* speed                */
  256.     u_char    msld_bdlen;    /* block descriptor length        */
  257.     /* 8 byte block descr if bdlen is non-zero */
  258.     u_char    msld_descode;    /* density code                */
  259.     u_char    msld_blkcnt[ MSLD_BLKCNT_SZ ];    /* number of blocks    */
  260.     u_char    msld_mbz3;    /* reserved, must be 0            */
  261.     u_char    msld_blklen[ MSLD_BLKLEN_SZ ];    /* block size        */
  262.     /* page data */
  263.     u_char  msld_vend[ MS_VEND_LEN ];
  264. } ct_g0msl_data_t;
  265.  
  266. /*
  267. ** Layout of the MODE SENSE Data
  268. */
  269.  
  270. /* maximum amount of mode sense info we accept */
  271. #define    MAX_MODE_SENS_DATA    (sizeof (ct_g0ms_data_t))
  272. #define    MSD_BDLEN    0x08    /* block descriptor length    */
  273. #define    MSD_BLKCNT_SZ    3    /* number of blocks        */
  274. #define    MSD_BLKLEN_SZ    3    /* length of a block        */
  275.  
  276. typedef struct
  277. {
  278.     /* 4 byte header */
  279.     u_char    msd_len;    /* sense data length        */
  280.     u_char    msd_mtype;    /* medium type (0?)        */
  281.     u_char    msd_wrp: 1,    /* write protect        */
  282.         msd_bfm: 3,    /* buffered/nonbuffered mode    */
  283.         msd_speed: 4;    /* speed            */
  284.     u_char    msd_bdlen;    /* block descriptor length        */
  285.     /* 8 byte block descr if bdlen non-zero */
  286.     u_char    msd_descode;    /* density code                */
  287.     u_char    msd_blkcnt[ MSD_BLKCNT_SZ ];    /* number of blocks    */
  288.     u_char    msd_mbz0;    /* reserved, must be 0            */
  289.     u_char    msd_blklen[ MSD_BLKLEN_SZ ];    /* block size        */
  290.     /* page data */
  291.     u_char  msd_vend[MS_VEND_LEN];
  292. } ct_g0ms_data_t;
  293.  
  294. /*
  295. ** Command Descriptor Block for Group 0 commands.
  296. */
  297. typedef struct
  298. {
  299.     u_char    g0_opcode;    /* group code/command code    */
  300.     u_char    g0_lu: 3,    /* logical unit number        */
  301.         g0_cmd0: 5;    /* command dependent 0        */
  302.     u_char    g0_cmd1;    /* command dependent 1        */
  303.     u_char    g0_cmd2;    /* command dependent 2        */
  304.     u_char    g0_cmd3;    /* command dependent 3        */
  305.     u_char    g0_vu67: 2,    /* vendor unique bits 6 and 7    */
  306.         g0_mbz0: 4,    /* must be zero            */
  307.         g0_flag: 1,    /* flag                */
  308.         g0_link: 1;    /* link                */
  309. } ct_g0cdb_t;
  310.  
  311. /*
  312. ** Command Descriptor Block for Group 2 commands.
  313. */
  314. typedef struct
  315. {
  316.     u_char    g2_opcode;    /* group code/command code    */
  317.     u_char    g2_lu: 3,    /* logical unit number        */
  318.         g2_cmd0: 5;    /* command dependent 0        */
  319.     u_char    g2_cmd1;    /* command dependent 1        */
  320.     u_char    g2_cmd2;    /* command dependent 2        */
  321.     u_char    g2_cmd3;    /* command dependent 3        */
  322.     u_char    g2_cmd4;    /* command dependent 4        */
  323.     u_char    g2_cmd5;    /* command dependent 5        */
  324.     u_char    g2_cmd6;    /* command dependent 6        */
  325.     u_char    g2_cmd7;    /* command dependent 7        */
  326.     u_char    g2_vu67: 2,    /* vendor unique bits 6 and 7    */
  327.         g2_mbz0: 4,    /* must be zero            */
  328.         g2_flag: 1,    /* flag                */
  329.         g2_link: 1;    /* link                */
  330. } ct_g2cdb_t;
  331. /*
  332. ** Opcodes for Group 0 commands. These opcodes are composed of the
  333. ** group code and opcode.
  334. */
  335. #define    TST_UNIT_RDY_CMD    0x00
  336. #define    REWIND_CMD        0x01
  337. #define    REQ_BLKADDR        0x02
  338. #define    REQ_SENSE_CMD        0x03
  339. #define    REQ_BLKLIM_CMD        0x05
  340. #define    READ_CMD        0x08
  341. #define    WRITE_CMD        0x0a
  342. #define    SEEKBLK_CMD        0x0c
  343. #define    WFM_CMD            0x10
  344. #define    SPACE_CMD        0x11
  345. #define    INQUIRY_CMD        0x12
  346. #define    MODE_SEL_CMD        0x15
  347. #define    RESERV_UNIT_CMD        0x16
  348. #define    REL_UNIT_CMD        0x17
  349. #define    ERASE_CMD        0x19
  350. #define    MODE_SENS_CMD        0x1a
  351. #define    L_UL_CMD        0x1b
  352. #define    PREV_MED_REMOV_CMD    0x1e    /* not on Kennedy */
  353. #define    LOCATEBLK_CMD        0x2b
  354. #define READ_POS_CMD    0x34    /* SCSI 2 (DAT) read position */
  355. #define LOG_SELECT_CMD    0x4C    /* SCSI 2 (DAT) set logging params */
  356. #define LOG_SENSE_CMD    0x4D    /* SCSI 2 (DAT) get logged info */
  357.  
  358. /*
  359. ** LED controll subfunctions 
  360. */
  361. #define CT_PREV_REMOV        0x01
  362. #define CT_ALLOW_REMOV        0x00
  363.  
  364. /*
  365. ** Space sub-function codes
  366. */
  367. #define    SPACE_BLKS_CODE    0    /* space blocks code            */
  368. #define    SPACE_FM_CODE    1    /* space filemarks code            */
  369. #define    SPACE_SFM_CODE    2    /* space sequential filemarks code    */
  370. #define    SPACE_EOM_CODE    3    /* space to end of recorded media code    */
  371. #define    SPACE_SETM_CODE    4    /* space setmarks code    */
  372.  
  373. /*
  374. ** Load sub-function bits.
  375. */
  376. #define    L_UL_RETENSION    0x02    /* bit to set in the load/unload CDB to do a */
  377.                 /*   retention                     */
  378. #define    L_UL_LOAD    0x01    /* bit to set if you want a load operation   */
  379.  
  380. /*
  381. /*
  382. **    This structure contains the info for each logical unit.
  383. **    The arrangement of this structure is such that a hex dump is
  384. **    elatively easy to interpret, and minimize gaps.
  385. **    sub structures must follow a long or ptr, OR have a
  386. **    long or ptr as first member OR be part of union that has
  387. **    a long if they will be used for DMA, since compiler won't
  388. **    force quad alignment otherwise. (marked with DMA in comments)
  389. */
  390. typedef struct
  391. {
  392.     union {
  393.         ct_g0cdb_t    g0cdb;    /* group 0 command descriptor block (DMA) */
  394.         ct_g2cdb_t    g2cdb;    /* group 2 command descriptor block (DMA) */
  395.     } ct_cmd;
  396.     u_char    ct_lastcmd;    /* last command issued, except request sense */
  397.     u_char    ct_openflags;    /* flags from current open call */
  398.     u_char ct_partnum;    /* for partitioned tapes, which partition. */
  399.     u_char ct_scsiv;    /* scsi1 or scsi2, from inq */
  400.     u_char ct_cansync;    /* set if scsiv >=2 and id_sync set */
  401.     dev_t    ct_lastdev;    /* dev on last open; for density/mode changes */
  402.     uint ct_sili: 1,    /* suppress illegal length error (MTCAN_SILI) */
  403.          ct_cipherrec: 1,    /* cipher 540 report recovered errors */
  404.          ct_speed: 1,    /* high or low speed if MTCAN_SETSP */
  405.          ct_density: 8;    /* density value for modesel if MTCAN_SETDEN */
  406.     scsisubchan_t    *ct_subchan;    /* pointer to allocated subchan    */
  407.     struct tpsc_types ct_typ;    /* a copy of the tpsc_type struct, not
  408.         a pointer, because extra code to de-reference really adds up */
  409.     buf_t    *ct_bp;        /* pointer to allocated buf_t   */
  410.     buf_t    *ct_reqbp;        /* buf_t * for reqsense   */
  411.     ulong    ct_state;    /* state of the device        */
  412.     ulong    ct_recov_err;    /* # recoverable errors        */
  413.     ulong    ct_blksz;    /* current blksz in bytes for fixed mode */
  414.     ulong    ct_fixblksz;    /* blksz in bytes for fixed mode, set only
  415.         on first open (from dfltblksz), and by SETFIXED ioctl.
  416.         Used when switching between variable and fixed modes */
  417.     ulong    ct_cur_minsz;    /* min size block drive supports, may be diff
  418.         than blkinfo value */
  419.     ulong    ct_cur_maxsz;    /* max size block drive supports, may be diff
  420.         than blkinfo value */
  421.     ulong    ct_readcnt;    /* reads on this open (not bytes) */
  422.     ulong    ct_writecnt;    /* writes on this open (not bytes) */
  423.     ct_g0es_data_t    ct_es_data; /* extended sense info */
  424.     union ct_bufarea { /* info that isn't needed across commands (DMA) */
  425.         int resid;    /* force alignment, and for ctgetblklen */
  426.         ct_g0inq_data_t    inq_data;    /* inquiry data */
  427.         ct_g0msl_data_t    msl;    /* mode select */
  428.         ct_g0ms_data_t    ms;    /* mode sense */
  429.         u_char    posninfo[20]; /* tmp read buffer for READPOSN */
  430.         u_char    blklenbuf[4]; /* tmp read buffer for GETBLKLEN */
  431.         u_char    reqblkinfo[6]; /* get block limits */
  432.     } *ct_bufarea;
  433.     struct mtblkinfo blkinfo;    /* from mtio.h */
  434. } sa_ct_target_t;
  435.  
  436. typedef sa_ct_target_t ctinfo_t;    /* keep old name for back compat,
  437.     but use shorter and more descriptive name */
  438.  
  439. #define ct_g0cdb ct_cmd.g0cdb
  440. #define ct_g2cdb ct_cmd.g2cdb
  441. #define ct_resid ct_bufarea->resid
  442. #define ct_inq_data ct_bufarea->inq_data
  443. #define ct_msl ct_bufarea->msl
  444. #define ct_ms ct_bufarea->ms
  445. #define ct_blklenbuf ct_bufarea->blklenbuf
  446. #define ct_posninfo ct_bufarea->posninfo
  447. #define ct_reqblkinfo ct_bufarea->reqblkinfo
  448.  
  449.  
  450. /*
  451. ** Masks for the various bits of the minor device number
  452. */
  453. #define    SCSIID_MSK    0x07    /* mask for SCSI ID of target    */
  454. #define    HAID_MSK    0x08    /* mask for Host adaptor number    */
  455. #define    REWIND_MSK    0x10    /* mask for rewind/norewind bit    */
  456. #define    SWAP_MSK    0x20    /* mask for swap/noswap bit    */
  457. #define VAR_MSK        0x40    /* mask for fixed/variable bit  */
  458. #define    DRIVE_MSK    (3<<3)    /* mask for drive specific bits, (in
  459.     'real' minor #, not internal form); currently used only for
  460.     density. */
  461.  
  462. #define    CT_LUNIT    0    /* only lun 0 supported */
  463.  
  464. /*
  465. ** Shift values to convert various bits in the minor device to a number
  466. */
  467. #define    HAID_SHIFT    3
  468.  
  469. /*
  470. ** Macros for convience sake (use tpsc internal version of minor #)
  471. */
  472. #define    SCSIID_DEV(dev)        ((dev) & SCSIID_MSK)
  473. /* rewind devices rewind on close ONLY, unless media changed,
  474.  * in which case they rewind on next open also */
  475. #define    ISTPSCREWIND_DEV(dev)    (((dev) & REWIND_MSK ) == 0)    
  476. #define    ISSWAP_DEV(dev)        ((dev) & SWAP_MSK)
  477. #define ISVAR_DEV(dev)          (((dev) & VAR_MSK) && (ctinfo->ct_typ.tp_capablity&MTCAN_VAR))
  478. #define    DENSITY_DEV(dev)  (((dev) & DRIVE_MSK)>>3) /* if MTCAN_SETDEN */
  479.  
  480. /*
  481. ** Stuff to map a host adaptor logical number to the SCSI ID.
  482. */
  483. #define    HA_SCSI_ID        0
  484.  
  485. /*
  486. ** Flag value passed by ctcmd() to the specific function routine
  487. */
  488. #define    CTCMD_SETUP    0    /* setup to issue cdb    */
  489. #define    CTCMD_ERROR    1    /* error        */
  490. #define    CTCMD_NO_ERROR    2    /* no error        */
  491.  
  492.  
  493. /*    The transfer timeout needs to be proportional to the amount of i/o
  494.     being done.  This is fairly easy for the fixed block devices.
  495.     For variable mode, one also needs to take into account the
  496.     size of the i/o, but since the max i/o size is much smaller,
  497.     this really isn't much of a problem.   Loading and rewinding
  498.     tapes is more problematical, since we may not know where we
  499.     are.  Exabyte tapes take a max of 2:15 sec, plus possible load
  500.     time of ~15 seconds.  On Kennedy, rewind of 2400' tape is
  501.     aprox 4 minutes.  Space commands are straight forward for
  502.     space block, but space filemark is something else.  On
  503.     Exabyte, space is ~10 times as fast as i/o, so max would
  504.     be 20 minutes, while on Kennedy, for a 2400 ft tape, it
  505.     would be ~4 minutes.  See tp_xfr_divisor and tp_spacetimeo also.
  506.     All times should be a bit on the generous side; the xfer
  507.     timeout should allow for retries, possible start/stop time,
  508.     and for held off reads/writes like the Kennedy will do.
  509. */
  510.  
  511. /* rewind, retension, erase, and load/unload timeouts */
  512. #define REWIND_TIMEO    (ctinfo->ct_typ.tp_rewtimeo)
  513.  
  514. /*    tpsc_min_delay is for cmds that don't do media i/o,
  515.     and min for any i/o. This long because if tape isn't moving
  516.     some devices take considerably longer than you would expect;
  517.     and we want to be conservative. lbootable so customers can
  518.     more easily add non-standard drives.
  519. */
  520. #define XFER_TIMEO(cnt) max(cnt/ctinfo->ct_typ.tp_xfr_divisor, \
  521.     ctinfo->ct_typ.tp_mintimeo)
  522.  
  523. /* this is only for space FM, and space to EOM; space record uses
  524.  * XFER_TIMEO, partly because some QIC drives implement them
  525.  * (particularly back spacing) as read and check, which is
  526.  * very slow. */
  527. #define SPACE_TIMEO    ctinfo->ct_typ.tp_spacetimeo
  528.  
  529. /* delay time between retries when status BUSY is returned */
  530. #define    BUSY_INTERVAL     (HZ)
  531.  
  532. #define SHORT_TIMEO    ctinfo->ct_typ.tp_mintimeo
  533.  
  534.  
  535. /* macros for determining drive type */
  536. /*
  537.  * The CIPHER 540S drives have a couple of bothers:
  538.  * 1) they don't identify themselves through the INQUIRY command
  539.  * 2) by default, they report recoverable errors, however they
  540.  *    do it incorrectly - if one for example is spacing forward
  541.  *    and encounters a recoverable error, it issues a check-condition
  542.  *    with the RECERR sense key - but the FILE MARK bit is NOT ON
  543.  *    so we lose track of where we are.
  544.  *    To get around this, we set the CIPHER specific SEC bit on
  545.  */
  546. #define IS_CIPHER(ctinfo) (ctinfo->ct_typ.tp_type == CIPHER540)
  547.  
  548. #define IS_TANDBERG(ctinfo) (ctinfo->ct_typ.tp_type == TANDBERG3660)
  549.  
  550. /*
  551.  * want to know if drive is a viper 150 because it can read 310 oersted 
  552.  * tapes, but it can't write them.
  553.  */
  554. #define IS_VIPER150(ctinfo) (ctinfo->ct_typ.tp_type == VIPER150)
  555. #define IS_VIPER60(ctinfo) (ctinfo->ct_typ.tp_type == VIPER60)
  556.  
  557. /* claimed to be 100% compatible with the 150, with some extra
  558.  * capablities (can do tape updates like 9 track), has variable
  559.  * block size. */
  560. #define IS_DATTAPE(ctinfo) (ctinfo->ct_typ.tp_type == DATTAPE)
  561.  
  562.  
  563. /*
  564. ** Exabyte uniquenesses:
  565. ** 1. does not support the RESERVE UNIT or RELEASE UNIT commands.
  566. ** 2. uses 1K blocks in fixed mode.
  567. */
  568. #define IS_EXABYTE(ctinfo) ((ctinfo->ct_typ.tp_type == EXABYTE8200) || \
  569.     (ctinfo->ct_typ.tp_type == EXABYTE8500))
  570.  
  571. /* Kennedy 9 track drives */
  572. #define IS_KENNEDY(ctinfo) (ctinfo->ct_typ.tp_type == KENNEDY96X2)
  573.  
  574.  
  575. #endif /* _KERNEL */
  576.  
  577.  
  578.  
  579. /* The values for ct_typ.tp_type, not same as hinv types */
  580. #define TPUNKNOWN    0    /* type not known */
  581. #define CIPHER540    1    /* cipher QIC24 */
  582. #define TANDBERG3660    2    /* TANDBERG 3660 QIC150 */
  583. #define VIPER150    3    /* VIPER 150 QIC150 */
  584. #define KENNEDY96X2    4    /* Kennedy 96[16]2 1/2" 9 track */
  585. #define EXABYTE8200    5    /* Exabyte EXB-8200 8mm cartridge tape */
  586. #define VIPER60        6    /* VIPER 60 QIC24 */
  587. #define DATTAPE        7    /* Digital Audio Tape */
  588. #define EXABYTE8500    8    /* Exabyte EXB-8500 8mm cartridge tape */
  589.  
  590. /*    States for the logical unit (ct_state).  states common with
  591.     mtio.h as much as possible.  Note that for MTIOCGET, the position
  592.     bits get put in dposn, the low 16 bits in dsreg, and the upper 16
  593.     bits in erreg.  These bits are all available to users now, so they
  594.     are no longer ifdef _KERNEL.
  595. */
  596. #define CT_ONL    MT_ONL        /* drive is online */
  597. #define CT_WRP    MT_WPROT    /* drive is write-protected */
  598. #define CT_EOM    MT_EOT        /* drive is at end of media */
  599. #define CT_BOT    MT_BOT        /* drive is at beginning of media */
  600. #define CT_FM    MT_FMK        /* drive is at file mark */
  601. #define    CT_QIC24    MT_QIC24    /* tape is low density (310 oersted); 
  602.     only set for Viper 150 drives */
  603. #define    CT_QIC120    MT_QIC120    /* tape is high density (550 oersted); 
  604.     QIC120 15 tracks. */
  605. #define CT_EOD    MT_EOD    /* at end of data, may also be EOT */
  606.  
  607. /*    beware the bits defined in mtio.h! */
  608. #define    CT_EW        0x08    /* hit early warning marker    */
  609. #define CT_GETBLKLEN    0x10    /* in the process of determining block
  610.                     length of data on the tape */
  611. #define    CT_MOTION    0x20    /* a command has been performed that
  612.     (potentially) moves the tape since last tape change or reset */
  613. #define    CT_OPEN        0x200    /* device open            */
  614. #define    CT_READ        0x400    /* opened for reading        */
  615. #define    CT_WRITE    0x800    /* opened for writing        */
  616. #define    CT_CHG        0x1000    /* unit attn occurred        */
  617. #define CT_DIDIO    0x2000    /* i/o has been successfully done on this open.
  618.     Used to handle case where first read after open hits a FM, in which
  619.     case we automatically skip over the FM.  Driver no longer spaces
  620.     to a FM on first tape command after open, since that made mt [bf]sr
  621.     relatively worthless, with no way around it except writing a program
  622.     that does all the ioctls itself.  This gets cleared on any of the
  623.     space, rewind, etc. commands. */
  624. #define    CT_NEEDBOT    0x10000    /* program needs to position at BOT
  625.     before doing any i/o.  Set if opening Kennedy for diff
  626.     density/mode and not at BOT on open */
  627. #define CT_LOADED    0x20000    /* The tape has been loaded, but is not
  628.     necessarily at BOT. */
  629. #define CT_ANSI    0x40000    /* allow i/o after EOT marker for 9 track tapes.
  630.     This allows ANSI labels to be used.  Works for QIC tapes also.
  631.     (see MTANSI in mtio.h) */
  632. #define CT_SMK    0x80000        /* drive is at a setmark.  Note that a skip
  633.     block or skip fm command will stop if a setmark is encountered. */
  634. #define CT_AUDIO    0x100000    /* Drive is in audio mode; persists until
  635.     reset, tape change, or reboot */
  636. #define CT_AUD_MED    0x200000    /* the media in the drive is in audio
  637.     format.  Set automatically on reads, or by the MTAUD ioctl */
  638. #define CT_MULTPART    0x400000    /* the media in the drive is a multi-
  639.     partition tape.  Currently only DAT supports this */
  640. #define CT_SEEKING    0x800000    /* a seek or rewind done with the
  641.     immediate bit set is still in progress; returned in the mt_erreg
  642.     field on MTIOCGET; never set in ct_state itself.  This will 
  643.     currently happen only while in audio mode. */
  644. #define CT_HITFMSHORT    0x1000000    /* in fixed blk mode, we hit a FM,
  645.     and returned a short count (not 0); the next read must return 0
  646.     (assuming no other intervening tape movement) so program knows a
  647.     FM has been reached.  Can't happen in variable block mode */
  648. #ifdef _KERNEL
  649.  
  650. /* tape postion flags cleared on tape motion cmds and tape change */
  651. #define CTPOS (CT_LOADED|CT_BOT|CT_EOM|CT_FM|CT_SMK|CT_EOD|CT_EW|CT_HITFMSHORT)
  652.  
  653. /*    states that persist across close/open. (if tape changes, etc.
  654.     some may be cleared at interrupt time) */
  655. #define CTKEEP (CTPOS|CT_MOTION|CT_ONL|CT_QIC24|CT_QIC120|CT_WRP\
  656.     |CT_AUDIO|CT_AUD_MED|CT_MULTPART)
  657.  
  658. /* these states don't persist across a tape change */
  659. #define CHGSTATES (CTKEEP|CT_NEEDBOT)
  660.  
  661. /* these states get cleared on a rewind, load, or a space BSF */
  662. #define BACKSTATES (CT_DIDIO|CT_NEEDBOT|CTPOS)
  663.  
  664. #endif /* _KERNEL */
  665.